#include "taskwindow.h"

TaskWindow::TaskWindow(QWidget *parent)
{
    setDefaultDropAction(Qt::MoveAction);
    setDragDropMode(QListWidget::DragDrop);
    setDragEnabled(true);
    setAcceptDrops(true);
}

// 鼠标移动到接收拖拽区域内松手 触发此事件
void TaskWindow::dragEnterEvent(QDragEnterEvent *event)
{
    if(event->mimeData()->hasFormat("transfer"))
    {
        event->accept();  // 接收拖动进入事件
    }
    else
    {
        QListWidget::dragEnterEvent(event);
    }
}

// 鼠标移动到接收拖拽区域内松手且移动 触发此事件
void TaskWindow::dragMoveEvent(QDragMoveEvent *event)
{
    if(event->mimeData()->hasFormat("transfer"))
    {
        event->accept();    // 接受拖动事件
    }
    else
    {
        QListWidget::dragMoveEvent(event);
    }
}

void TaskWindow::dropEvent(QDropEvent *event)
{
    if(event->mimeData()->hasFormat("transfer"))
    {
        QByteArray byteArray = event->mimeData()->data("transfer");     // 解密数据
        qDebug() << QString(byteArray);
        TaskItem *item = AbstractFactory::createTaskItem(QString(byteArray));
        if(item)
        {
            item->setWindowParam(&m_pic, &m_tmpPic, &m_mask);   // 设置任务窗口独有的图像和掩码
            // 中间插入
            QListWidgetItem *witem = itemAt(event->position().toPoint());
            if(witem)
            {
                m_items.insert(row(witem), item);
                emit updateTaskItem(row(witem));
            }
            // 尾插
            else
            {
                m_items.append(item);
                emit updateTaskItem(m_items.size()-1);
            }
        }
    }
    else
    {
        int dropIndex = row(itemAt(event->position().toPoint()));
        if(dropIndex != -1 && dropIndex != m_dragIndex)     // 拖动位置一定要不一样
        {
            swap(m_items[m_dragIndex], m_items[dropIndex]); // 交换任务位置
            QListWidget::dropEvent(event);                  // ListItem 成员交给父类交换
            updateTasks(-1);                                // 更新任务
        }
    }
}

void TaskWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->button() & Qt::LeftButton)
    {
        QListWidgetItem* curitem = itemAt(event->pos());
        if(curitem)
        {
            m_dragIndex = row(curitem);     // 记录拖动项下标
        }
    }
    QListWidget::mousePressEvent(event);
}

void TaskWindow::contextMenuEvent(QContextMenuEvent *event)
{
    QMenu menu;
    QAction del("删除");
    QAction copy("复制");
    QAction paste("粘贴");
    menu.addAction(&del);
    menu.addAction(&copy);
    menu.addAction(&paste);

    // 删除
    connect(&del, &QAction::triggered, this, [=]{
        QPoint pos = event->pos();
        QListWidgetItem *curItem = itemAt(pos);
        if(curItem)
        {
            QWidget *widget = itemWidget(curItem);
            QString name = widget->findChild<QCheckBox*>()->text();
            qDebug() << name;
            if(name == "固定二值化" || name == "自适应二值化")
                ; // TODO

            m_items.erase(m_items.begin()+row(curItem));  // 删除任务对象
            qDebug() <<"删除第" << row(curItem) << "任务对象";
            // removeItemWidget(curItem); // 有问题
            delete takeItem(row(curItem)); //
            updateTasks(-1);
        }
    });
    // 复制
    connect(&copy, &QAction::triggered, this, [=]{
        QPoint pos = event->pos();
        QListWidgetItem *curItem = itemAt(pos);
        if(curItem)
        {
            QWidget* widget = itemWidget(curItem);
            QString name = widget->findChild<QCheckBox*>()->text();  // 获得勾选框里的文字信息
            m_tmpItem =  AbstractFactory::createTaskItem(name);      // 创建一份新的任务对象
            TaskItem *task = m_items[row(curItem)];
            if(!m_tmpItem)
            {
                qDebug() << "task is nullptr";
                return ;
            }
            m_tmpItem->setClick(task->isClicked());
            QMap<QString, QString> param = task->getParam();
            m_tmpItem->setParam(param);
        }
    });

    // 粘贴
    connect(&paste, &QAction::triggered, this, [=]{
        QPoint pos = event->pos();
        QListWidgetItem *item = itemAt(pos);
        if(m_tmpItem)
        {
            qDebug() << "粘贴在第" << row(item) << "任务对象前";
            if(item)
            {
                m_items.insert(row(item), m_tmpItem);
                emit updateTaskItem(row(item));
            }
            else
            {
                m_items.append(m_tmpItem);
                emit updateTaskItem(m_items.size()-1);
            }
            m_tmpItem = nullptr;
            emit updateTasks(-1);
        }
    });

    menu.exec(event->globalPos());  // 在鼠标点击的地方显示菜单
}

void TaskWindow::updateTasks(int Num)
{
    if(!m_tmpPic.isNull())
    {
        emit updatePicture(false, Num);  // 让 m_tmpPic 和 m_pic 还原成原来图片
        QThread::usleep(100);
        TaskItem* task;
        if(m_items.empty())
        {
            emit updatePicture(true, Num);
            return;
        }
        for (int i = 0; i < m_items.size(); ++i)
        {
            task = m_items[i];
            if(task->isClicked())
            {
                // 更新图片源，一个任务执行完，另一个任务加入时，存上一个任务执行完的图片结果
                if(!m_tmpPic.isNull())
                    m_tmpPic = m_pic.copy();
                task->method(m_mask, &m_tmpPic, &m_pic);
            }
        }
        emit updatePicture(true, Num);  // 让MainWindow更新场景图像
    }
}
